#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: 03_batch_gradient_descent.py
# 批量梯度下降:
#   总体思路: 在调整模型θ的时候, 每一次都使用了所有的m条样本, 所以
#         计算量会比较大, 但是结果会比较准确, 因为每次都考虑了所有的数据

import numpy as np

# 样本总数量
sample_count = 100

# 使用1填充一个 100 * 1 的矩阵
X_0 = np.ones((sample_count, 1))
# 创建一个 100 * 1 的矩阵, 每个值都乘以2
X_1 = 2 * np.random.rand(sample_count, 1)
# 给写好的方程 加上一个标准正态分布上的随机取值
y = 4 + 3 * X_1 + np.random.randn(sample_count, 1)
# 把前面生成的两个矩阵合二为一, 0代表第0列, 1代表第1列
X = np.c_[X_0, X_1]

# 规定学习率
learning_rate = 0.1
# 最大的迭代次数
max_itertion_times = 1000

# 随机初始化一个theta, 从这个值上开始迭代
theta = np.random.randn(2, 1)

# 用来标记一共循环了多少次
count = 0

for _ in range(max_itertion_times):
    count += 1
    gradients = 1 / sample_count * X.T.dot(X.dot(theta) - y)
    theta = theta - learning_rate * gradients
    print(theta)

print(count)
print(theta)
